package com.zenithmind.library.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zenithmind.library.pojo.domain.Reservation;
import com.zenithmind.library.pojo.query.ReservationQuery;
import com.zenithmind.library.pojo.vo.ReservationVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.List;

/**
 * 预约Mapper接口
 * 
 * @author ZenithMind
 * @since 2024-06-14
 */
@Mapper
public interface ReservationMapper extends BaseMapper<Reservation> {

    /**
     * 分页查询预约记录
     * 
     * @param page 分页参数
     * @param query 查询条件
     * @return 分页结果
     */
    IPage<ReservationVO> selectReservationPage(Page<ReservationVO> page, @Param("query") ReservationQuery query);

    /**
     * 根据用户ID查询预约记录
     * 
     * @param page 分页参数
     * @param userId 用户ID
     * @param query 查询条件
     * @return 分页结果
     */
    IPage<ReservationVO> selectReservationsByUser(Page<ReservationVO> page, 
                                                 @Param("userId") String userId, 
                                                 @Param("query") ReservationQuery query);

    /**
     * 根据图书ID查询预约记录
     * 
     * @param page 分页参数
     * @param bookId 图书ID
     * @param query 查询条件
     * @return 分页结果
     */
    IPage<ReservationVO> selectReservationsByBook(Page<ReservationVO> page, 
                                                 @Param("bookId") String bookId, 
                                                 @Param("query") ReservationQuery query);

    /**
     * 获取用户当前预约记录
     * 
     * @param userId 用户ID
     * @return 预约记录列表
     */
    List<ReservationVO> selectCurrentReservationsByUser(@Param("userId") String userId);

    /**
     * 获取图书预约队列
     * 
     * @param bookId 图书ID
     * @return 预约记录列表
     */
    List<ReservationVO> selectBookReservationQueue(@Param("bookId") String bookId);

    /**
     * 获取可取书的预约记录
     * 
     * @param page 分页参数
     * @param query 查询条件
     * @return 分页结果
     */
    IPage<ReservationVO> selectAvailableReservations(Page<ReservationVO> page, @Param("query") ReservationQuery query);

    /**
     * 获取过期的预约记录
     * 
     * @param page 分页参数
     * @param query 查询条件
     * @return 分页结果
     */
    IPage<ReservationVO> selectExpiredReservations(Page<ReservationVO> page, @Param("query") ReservationQuery query);

    /**
     * 统计用户当前预约数量
     * 
     * @param userId 用户ID
     * @return 预约数量
     */
    int countUserCurrentReservations(@Param("userId") String userId);

    /**
     * 统计图书预约数量
     * 
     * @param bookId 图书ID
     * @return 预约数量
     */
    int countBookReservations(@Param("bookId") String bookId);

    /**
     * 检查用户是否已预约该图书
     * 
     * @param userId 用户ID
     * @param bookId 图书ID
     * @return 预约数量
     */
    int countUserBookReservation(@Param("userId") String userId, @Param("bookId") String bookId);

    /**
     * 获取下一个排队位置
     * 
     * @param bookId 图书ID
     * @return 排队位置
     */
    int getNextQueuePosition(@Param("bookId") String bookId);

    /**
     * 更新预约状态
     * 
     * @param id 预约ID
     * @param status 状态
     * @return 更新行数
     */
    int updateReservationStatus(@Param("id") String id, @Param("status") Integer status);

    /**
     * 更新排队位置
     * 
     * @param bookId 图书ID
     * @param cancelledPosition 取消的位置
     * @return 更新行数
     */
    int updateQueuePositions(@Param("bookId") String bookId, @Param("cancelledPosition") Integer cancelledPosition);

    /**
     * 批量更新过期状态
     * 
     * @return 更新行数
     */
    int batchUpdateExpiredStatus();

    /**
     * 获取需要通知的预约记录
     * 
     * @return 预约记录列表
     */
    List<ReservationVO> selectReservationsNeedNotification();

    /**
     * 更新通知状态
     * 
     * @param id 预约ID
     * @param notified 是否已通知
     * @return 更新行数
     */
    int updateNotificationStatus(@Param("id") String id, @Param("notified") Integer notified);

    /**
     * 获取预约统计信息
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计信息
     */
    ReservationVO selectReservationStatistics(@Param("startDate") LocalDate startDate, 
                                             @Param("endDate") LocalDate endDate);

    /**
     * 获取热门预约图书
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param limit 限制数量
     * @return 图书列表
     */
    List<ReservationVO> selectHotReservedBooks(@Param("startDate") LocalDate startDate, 
                                              @Param("endDate") LocalDate endDate, 
                                              @Param("limit") Integer limit);
}
